package IOStream_etc.ObjectFlow_etc;

import org.junit.Test;

import java.io.*;

/**
 * @author Jimmy Zhan WORKSTATION
 * @date 2023/3/29 17:03
 * 说明：
 */

public class ObjectInputOutputStreamTest {
    /**
     * 序列化过程：使用ObjectOutputStream流实现。将内存中的JAVA对象保存在文件中或通过网络传输出去
     */

    @Test
    public void test1() throws IOException {
        // 1. 创建对象
        File file = new File("object.txt");
        // 处理流要包一个节点流
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));

        // 2. 写数据，即序列化的过程
        oos.writeUTF("你好，我的名字是ABC");
        oos.flush();

        oos.writeObject("一般对象的序列化");
        oos.flush();

        oos.close();
    }

    /**
     * 反序列化过程：使用ObjectInputStream流实现。将文件中的数据或网络传输过来的数据还原为内存中的JAVA对象
     */
    @Test
    public void test2() throws IOException, ClassNotFoundException {
        // 1. 创建对象
        File file = new File("object.txt");

        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));

        // 2. 读取文件中的对象（或反序列化的过程）
        String str1 = ois.readUTF();
        System.out.println(str1);
        Object o1 = ois.readObject();
        System.out.println(o1);
        ois.close();
    }

    /**
     * 演示自定义类的序列化和反序列化
     */
    @Test
    public void test3() throws IOException {

        // 1. 创建对象
        File file = new File("person.dat");
        // 处理流要包一个节点流
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));

        // 2. 写数据，即序列化的过程
        Person p1 = new Person("Tom", 12);

        oos.writeObject(p1);
        oos.flush();

        oos.close();
    }

    /**
     * 反序列化
     */
    @Test
    public void test4() throws IOException, ClassNotFoundException {
        File file = new File("person.dat");
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));

        Person p1 = (Person)ois.readObject();
        System.out.println(p1);

        ois.close();
    }
}
